package app

import (
	"context"
	"lbs-sdk/netfilter"

	"gitlab.xunlei.cn/xacc/fastlogger"
	nd "gitlab.xunlei.cn/xacc/xlan/net_device"
)

// func ConnectXlanClientAnd

var logConnect = fastlogger.WithField("module", "connect")

type VpnIo interface {
	Read(p []byte) (n int, err error)
	Write(p []byte) (n int, err error)
	Close() error
}

func XlanClientToNetfilter(ctx context.Context, xlanCli *XlanVpnIo, netfilter *netfilter.ClientDriverNf) {
	for {
		select {
		case <-ctx.Done():
			logConnect.Warnf("xlan to netfilter context done")
			return
		default:
		}
		xp, err := xlanCli.xlanDev.ReadPkg(0)
		if err != nil {
			logConnect.Warnf("xlan read err: %v", err)
			return
		}
		err = netfilter.IpPkgToNetfilter(xp.GetPayload())
		if err != nil {
			logConnect.Warnf("xlan to netfilter err: %v", err)
			continue
		}
	}
}

func NetfilterToXlanClient(ctx context.Context, xlanCli *XlanVpnIo, netfilter *netfilter.ClientDriverNf) {
	netfilter.SetWriter(xlanCli)
}

func ConnectWithXlanClient(ctx context.Context, link *nd.LinkInfo) error {
	xlanCli, err := ConnectWithLink(link)
	if err != nil {
		logConnect.Errorf("failed to create xlan client: %v", err)
		return err
	}
	go XlanClientToNetfilter(context.Background(), xlanCli, netfilter.DefaultClientDriverNf)
	go NetfilterToXlanClient(context.Background(), xlanCli, netfilter.DefaultClientDriverNf)
	return nil
}
